module semmleClasses

abstract sig Classes{
	extend: set Classes
}

sig Project extends Classes{}{
	extend = none
}

sig Locatable extends Classes{}{
	extend = none
}

sig Container extends Classes{}{
	extend = Project
}

sig File extends Classes{}{
	extend = Locatable + Container
}

sig Element extends Classes{}

sig Package extends Classes{}{
	extend = Element + Annotable
}

sig Annotable extends Classes{}{
	extend = Element
}

sig CompilationUnit extends Classes{}{
	extend = File + Element
}

sig Type extends Classes{}{
	extend = Element
}

sig Member extends Classes{}{
	extend = Element + Annotable
}

//secção das expressões
sig ExprParent extends Classes{}{
	extend = none
}

sig Expr extends Classes{}{
	extend = Expr
}

sig Annotation extends Classes{}{
	extend = Expr
}

sig AnnotationElement extends Classes{}{
	extend = Member
}

sig PrimitiveType extends Classes{}{
	extend = Type
}

//RefType e suas subclasses
sig RefType extends Classes{}{
	extend = Type
}

sig Interface extends Classes{}{
	extend = RefType
}

sig Class extends Classes{}{
	extend = RefType
}

sig EnumType extends Classes{}{
	extend = Class
}

sig BoxedType extends Classes{}{
	extend = RefType
}

sig AnnotationType extends Classes{}{
	extend = Interface
}

sig ClassOrInterface extends Classes{}{
	extend = RefType
}

run{}
